﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System.Configuration;

namespace Pittypat.Configuration
{
    /// <summary>
    /// pittypat 根配置节。
    /// </summary>
    public sealed class PittypatConfig : ConfigurationSection
    {
        /// <summary>
        /// ConfigSection 配置节的名称。这是一个常量字段，其值为 “pittypat”。
        /// </summary>
        const string SectionName = "pittypat";

        private static PittypatConfig current = null;
        private static readonly object currentLock = new object();

        /// <summary>
        /// 获取当前配置文件中定义的 pittypat 配置节。
        /// </summary>
        public static PittypatConfig Current
        {
            get
            {
                if (current == null)
                {
                    lock (currentLock)
                    {
                        if (current == null)
                        {
                            current = (PittypatConfig)ConfigurationManager.GetSection(SectionName);
                        }
                    }
                }

                return current;
            }
        }

        /// <summary>
        /// 获取或者设置用于解密数据服务路径的解密程序的类型，这是一个程序集限定的名称，如果没有提供，则认为路径没有被加密，不对路径进行解密。
        /// </summary>
        [ConfigurationProperty("dataServiceUrlDecryptor", IsRequired = false)]
        public string DataServiceUrlDecryptor
        {
            get
            {
                return (string)this["dataServiceUrlDecryptor"] ?? "";
            }
            set
            {
                this["dataServiceUrlDecryptor"] = value ?? "";
            }
        }

        /// <summary>
        /// 获取或者设置用户验证服务的实现类型，这是一个程序集限定的名称，如果没有提供，则认为所有用户都是未授权的匿名用户。
        /// </summary>
        [ConfigurationProperty("authorityService", IsRequired = false)]
        public string AuthorityService
        {
            get
            {
                return (string)this["authorityService"] ?? "";
            }
            set
            {
                this["authorityService"] = value ?? "";
            }
        }

        /// <summary>
        /// 获取或者设置通知中心服务的实现类型。
        /// </summary>
        [ConfigurationProperty("notificationService", IsRequired = false)]
        public string NotificationService
        {
            get
            {
                return (string)this["notificationService"] ?? "";
            }
            set
            {
                this["notificationService"] = value ?? "";
            }
        }

        /// <summary>
        /// 获取或者设置 WebSocket 缓冲区的尺寸，是客户端通过 WebSocket 单次发送数据的最大长度，单位：KB。默认为 8 KB。
        /// </summary>
        [ConfigurationProperty("socketDataSize", IsRequired = false, DefaultValue = 8)]
        public int SocketDataSize
        {
            get
            {
                var size = (int)this["socketDataSize"];
                return size < 1 ? 1 : (size > 1024 ? 1024 : size);
            }
            set
            {
                this["socketDataSize"] = value;
            }
        }

        /// <summary>
        /// 获取或者设置当前系统使用的为 IAuthorityService 接口提供系统令牌的提供程序的类型名称。默认为空字符串。
        /// </summary>
        /// <remarks>
        /// 如果当前系统使用了来自其他系统的登录、注销、权限检查等安全验证服务，则当前系统可能访问其他系统时需要提供一个系统令牌来标识当前系统。也就是 IAuthorityService 接口方法中使用的系统令牌。
        /// </remarks>
        [ConfigurationProperty("systemTokenProvider", IsRequired = false)]
        public string SystemTokenProvider
        {
            get
            {
                return (string)this["systemTokenProvider"] ?? "";
            }
            set
            {
                this["systemTokenProvider"] = value ?? "";
            }
        }

        /// <summary>
        /// 获取配置文件定义的所有的 App 配置项目的列表。
        /// </summary>
        [ConfigurationProperty("apps", IsDefaultCollection = true)]
        public AppConfigCollection Apps
        {
            get
            {
                return (AppConfigCollection)this["apps"];
            }
        }
    }
}
